package org.dezenho.client.IU;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

import org.dezenho.client.SO.DezenhoClient;
import org.dezenho.common.RMI.ServerInterface;


/** Classe responsavel pela interface com o Desenhista e acoes associadas a ele.
 * Esta classe herda configuracoes da GenericTela e implementa a Interface do padrao
 * Observer.
 * @author dafneguisard
 *
 */
public class Desenhista extends GenericTela implements DesenhistaObserver{

	private int tempoRestanteObserverState; 
	private static Desenhista instancia = new Desenhista();
	private static final long serialVersionUID = 1L;
	private JDesktopPane jDesktopPane = null;
	private PaintPanel jPanel = null;
	private JLabel jLabel = null;
	private JLabel jLabel1 = null;
	private JLabel jLabel2 = null;
	private JLabel jLabel3 = null;
	private JLabel jLabel4 = null;
	private JLabel jLabel5 = null;
	private JLabel jLabel6 = null;
	private JButton jButton = null;
	private ServerInterface server;
	private org.dezenho.client.RN.Desenhista desenhista;  //  @jve:decl-index=0:
	/**
	 * Construtor, associa o Desenhista Observer (attached)
	 *
	 */
	public Desenhista() {
		super();
		setDesenhista(DezenhoClient.getInstance().getDesenhista());
		DezenhoClient.getInstance().getDesenhista().setDesenhistaObserver(this);
	}

	/**
	 * Metodo para criar a tela do Desenhista
	 * Implementa tambem a acao de desconectar o usuario do servido quando a janela e fechada
	 * @param tempoTotal
	 * @param palavra
	 * @param multiplicador
	 */
	public  void criaTela(int tempoTotal,String palavra,int multiplicador ) {
		super.criaTela();
		this.setContentPane(getJDesktopPane());
		this.setTitle("Desenhista");
		this.getJLabel4().setText(String.valueOf(multiplicador));
		this.getJLabel2().setText(String.valueOf(tempoTotal));
		this.getJLabel6().setText(palavra);
	}
	/**
	 * Metodo para exibir o tempo restanta atualizado 
	 *
	 */
	public void atualizaTempoRestante(){
		getJLabel2().setText(String.valueOf(getTempoRestanteObserverState()));

	}
	/**
	 * Metodo do padrao Observer para receber tempo restante atualizado e
	 *simultaneamente coletar o desenho para que seja depois exibido ao 
	 *Adivinhador
	 */
	public void updateTempoRestante(){
		setTempoRestanteObserverState(getDesenhista().getTempoRestante());
		getDesenhista().setDesenho(coletaDesenho());		
		atualizaTempoRestante();
	}
	/**
	*Metodo para coletar o desenho feito sobre o JPanel
	 */
	public Point[] coletaDesenho(){
		return jPanel.getDesenho();
	}

//	metodos de acesso
	private JDesktopPane getJDesktopPane() {
		if (jDesktopPane == null) {
			jLabel6 = new JLabel();
			getJLabel6().setBounds(new Rectangle(195, 606, 187, 31));
			getJLabel6().setFont(new Font("Arial", Font.PLAIN, 14));
			jLabel5 = new JLabel();
			getJLabel5().setBounds(new Rectangle(13, 607, 181, 30));
			getJLabel5().setFont(new Font("Arial", Font.BOLD, 14));
			getJLabel5().setText("Palavra a ser desenhada:");
			jLabel4 = new JLabel();
			getJLabel4().setBounds(new Rectangle(236, 571, 20, 25));
			getJLabel4().setFont(new Font("Arial", Font.PLAIN, 14));
			jLabel3 = new JLabel();
			getJLabel3().setBounds(new Rectangle(134, 570, 98, 27));
			getJLabel3().setFont(new Font("Arial", Font.BOLD, 14));
			getJLabel3().setText("Multiplicador:");
			jLabel2 = new JLabel();
			getJLabel2().setBounds(new Rectangle(69, 571, 52, 25));
			getJLabel2().setFont(new Font("Arial", Font.PLAIN, 14));
			jLabel1 = new JLabel();
			getJLabel1().setBounds(new Rectangle(11, 570, 55, 26));
			getJLabel1().setFont(new Font("Arial", Font.BOLD, 14));
			getJLabel1().setText("Tempo:");
			jLabel = new JLabel();
			getJLabel().setBounds(new Rectangle(115, 39, 307, 86));
			getJLabel().setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);
			getJLabel().setIcon(getLogo());
			jDesktopPane = new JDesktopPane();
			jDesktopPane.add(getJPanel(), null);
			jDesktopPane.setBackground(Color.white);
			jDesktopPane.add(jLabel, null);
			jDesktopPane.add(jLabel1, null);
			jDesktopPane.add(jLabel2, null);
			jDesktopPane.add(jLabel3, null);
			jDesktopPane.add(jLabel4, null);
			jDesktopPane.add(jLabel5, null);
			jDesktopPane.add(jLabel6, null);
			jDesktopPane.add(getJButton(), null);
		}
		return jDesktopPane;
	}


	private JPanel getJPanel() {
		if(jPanel==null){
			jPanel = new PaintPanel();
			jPanel.setLayout(new GridBagLayout());
			jPanel.setBounds(new Rectangle(11, 144, 543, 408));
			jPanel.setBorder(new LineBorder(Color.RED));
			jPanel.setVisible(false);
		}
		return jPanel;
	}
	/**
	 * Metodo de acesso ao JButton associa a acao do botao ao comecar a rodada.
	 *A seguir o botao eh desabilitado.
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setBounds(new Rectangle(388, 607, 131, 30));
			jButton.setFont(new Font("Arial", Font.BOLD, 12));
			jButton.setText("Iniciar Desenho");
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					jPanel.setVisible(true);
					getDesenhista().comecaRodada();
					jButton.setEnabled(false);					
				}
			});
		}
		return jButton;
	}

	public void setJPanel(PaintPanel panel) {
		jPanel = panel;
	}
	public static Desenhista getInstancia() {
		return instancia;
	}

	public org.dezenho.client.RN.Desenhista getDesenhista() {
		return desenhista;
	}

	public void setDesenhista(org.dezenho.client.RN.Desenhista desenhista) {
		this.desenhista = desenhista;
	}

	public int getTempoRestanteObserverState() {
		return tempoRestanteObserverState;
	}

	public void setTempoRestanteObserverState(int tempoRestanteObserverState) {
		this.tempoRestanteObserverState = tempoRestanteObserverState;
	}
	public JLabel getJLabel4() {
		return jLabel4;
	}
	public void setJLabel4(JLabel label4) {
		jLabel4 = label4;
	}
	public JLabel getJLabel5() {
		return jLabel5;
	}
	public void setJLabel5(JLabel label5) {
		jLabel5 = label5;
	}
	public JLabel getJLabel6() {
		return jLabel6;
	}
	public void setJLabel6(JLabel label6) {
		jLabel6 = label6;
	}
	public JLabel getJLabel2() {
		return jLabel2;
	}
	public void setJLabel2(JLabel label2) {
		jLabel2 = label2;
	}
	public JLabel getJLabel() {
		return jLabel;
	}
	public void setJLabel(JLabel label) {
		jLabel = label;
	}
	public JLabel getJLabel1() {
		return jLabel1;
	}
	public void setJLabel1(JLabel label1) {
		jLabel1 = label1;
	}
	public JLabel getJLabel3() {
		return jLabel3;
	}
	public void setJLabel3(JLabel label3) {
		jLabel3 = label3;
	}
	public void setJDesktopPane(JDesktopPane desktopPane) {
		jDesktopPane = desktopPane;
	}


	public ServerInterface getServer() {
		return server;
	}


	public void setServer(ServerInterface server) {
		this.server = server;
	}
}


